import argparse
import pandas as pd
import re
import os


def convert_value(value):
    """
    将字符串值转换为数字
    - 处理带后缀的值: M(百万), B(十亿)
    - 处理带逗号的数字字符串
    - 处理普通数字字符串
    """
    # 如果是数字类型直接返回
    if isinstance(value, (int, float)):
        return value

    # 移除逗号并尝试转换
    clean_value = str(value).replace(',', '').strip()

    # 尝试匹配后缀格式 (如 5.2M 或 3B)
    match = re.match(r"^([\d.]+)\s*([MBmb])?$", clean_value)
    if match:
        num_str, suffix = match.groups()
        num = float(num_str)

        if suffix:
            # 根据后缀应用乘数
            multiplier = 1e6 if suffix.upper() == 'M' else 1e9
            return num * multiplier

        return num

    # 尝试直接转换为数字
    try:
        return float(clean_value)
    except ValueError:
        # 无法转换则返回原始值
        return value


def process_csv(file_path, column_index):
    """
    处理CSV文件并覆盖原始文件
    :param file_path: CSV文件路径
    :param column_index: 要处理的列索引(从1开始)
    """
    # 读取CSV文件
    df = pd.read_csv(file_path)

    # 验证列索引
    if column_index < 1 or column_index > len(df.columns):
        print(f"错误: 列索引 {column_index} 超出范围 (1-{len(df.columns)})")
        return

    # 获取列名 (索引从0开始)
    col_name = df.columns[column_index - 1]
    print(f"处理文件: {file_path}")
    print(f"目标列: 第{column_index}列 ({col_name})")

    # 转换列值
    df[col_name] = df[col_name].apply(convert_value)

    # 覆盖原始文件
    df.to_csv(file_path, index=False)
    print(f"成功转换并覆盖文件! 共处理 {len(df)} 行数据")


if __name__ == "__main__":
    # 设置命令行参数
    parser = argparse.ArgumentParser(description='CSV列值转换工具')
    parser.add_argument('-f', '--file', required=True, help='CSV文件路径')
    parser.add_argument('-c', '--column', type=int, required=True,
                        help='要转换的列索引(从1开始)')

    args = parser.parse_args()

    # 验证文件存在
    if not os.path.exists(args.file):
        print(f"错误: 文件不存在 - {args.file}")
        exit(1)

    # 执行转换
    process_csv(args.file, args.column)